/**
 * 
 */
package de.mbenning.fsim.persistence.dao;

import java.util.List;

import org.hibernate.ObjectNotFoundException;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;

import de.mbenning.fsim.domain.Position;
import de.mbenning.fsim.domain.Saison;
import de.mbenning.fsim.domain.Spieler;
import de.mbenning.fsim.domain.SpielerStatistik;
import de.mbenning.fsim.domain.SystemPosition;
import de.mbenning.fsim.domain.Verein;
import de.mbenning.fsim.persistence.dao.interfaces.ISpielerDAO;

/**
 * @author Martin.Benning
 *
 */
@Repository("spielerDAO")
public class SpielerDAO extends HibernateDaoSupport implements ISpielerDAO {
	
	@Autowired
	public SpielerDAO(SessionFactory sessionFactory) {
		this.setSessionFactory(sessionFactory);
	}

	/* (non-Javadoc)
	 * @see de.mbenning.fsim.persistence.dao.interfaces.ISpielerDAO#getSpielerById(java.lang.Integer)
	 */
	public Spieler getSpielerById(Integer id) {
		for (final Object object : getHibernateTemplate().find(" FROM Spieler A WHERE A.id = ? ", new Integer[]{id})) {
            return (Spieler) object;
        }
        throw new ObjectNotFoundException("Spieler", Spieler.class.getName());
	}

	/* (non-Javadoc)
	 * @see de.mbenning.fsim.persistence.dao.interfaces.ISpielerDAO#getSpielerByName(java.lang.String, java.lang.String)
	 */
	public Spieler getSpielerByName(String name, String vorname) {
		for (final Object object : getHibernateTemplate().find(" FROM Spieler A WHERE A.name = ? AND A.vorname = ? ", new String[]{name, vorname})) {
            return (Spieler) object;
        }
        throw new ObjectNotFoundException("Spieler", Spieler.class.getName());
	}
	
	public List<Spieler> findAllSpieler() {
		return getHibernateTemplate().find(" FROM Spieler A ORDER BY A.name "); 
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<Spieler> findSpielerByPositionAndLevel(Verein verein, Position position) {
		return getHibernateTemplate().find(" FROM Spieler A WHERE A.verein.id = ? AND A.position = ? ORDER BY A.level DESC ", new Object[] {verein.getId(), position});
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<Spieler> findSpielerBySystemPositionAndLevel(Verein verein, SystemPosition position) {
		return getHibernateTemplate().find(" FROM Spieler A WHERE A.verein.id = ? AND A.systemPosition = ? ORDER BY A.level DESC ", new Object[] {verein.getId(), position});
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Spieler> findSpielerByVerein(Verein verein) {
		return getHibernateTemplate().find(" FROM Spieler A WHERE A.verein.id = ? ORDER BY A.name ", verein.getId());
	}
	
	public SpielerStatistik getSpielerStatistik(Spieler spieler, Saison saison) {
		for (final Object object : getHibernateTemplate().find(" FROM SpielerStatistik A WHERE A.spieler.id = ? AND A.saison.id =  ?", new Integer[] {spieler.getId(), saison.getId()})) {
            return (SpielerStatistik) object;
        }
        throw new ObjectNotFoundException("SpielerStatistik", SpielerStatistik.class.getName());
	}

	@SuppressWarnings("unchecked")
	public List<SpielerStatistik> findAllSpielerStatistik(Spieler spieler) {
		return getHibernateTemplate().find(" FROM SpielerStatistik A WHERE A.spieler.id = ? ", spieler.getId());
	}

}
